package com.qf.service.impl;

import com.qf.filters.BlackFilters;
import com.qf.filters.FiltersChain;
import com.qf.service.DataFilterManager;
import com.qianfeng.smsplatform.common.model.Standard_Submit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Set;

/*
 * @Data: 2021/7/15 8:41
 * */
// 当前 策略 执行的是所有的过滤器
//@Service
public class DataFilterManagerImpl implements DataFilterManager {
/*
    private BlackFilters blackFilters;
    @Autowired
    public void setBlackFilters(BlackFilters blackFilters) {
        this.blackFilters = blackFilters;
    }*/

//    spring  实际上将对象通过key -value  类型的方式 保存在map中  会有多个map  其中是一个按照id 来保存的  一个ID对应一个对象
//    另外一个是按照类型对应的 一个类 对应N 个对象  就是集合  这也是我们在通过自动注入或者按照类类型获取对象的时候 如果对象有多个会报错

    private Map<String, FiltersChain> filterChainMap;
    @Autowired
    public void setFilterChainMap(Map<String, FiltersChain> filterChainMap) {
        this.filterChainMap = filterChainMap;
        System.out.println("filterChainMap-->"+filterChainMap);
    }

    @Override
    public void dealSms(Standard_Submit standard_submit) {

//        处理消息 这里应该拿 策略里的每一个方法  挨个去验证这个对象
//          拿到我们所声明的所有策略方法 挨个执行
        //1 从哪里拿到所有的filterchain?我们需要知道这些filterchain在哪里存着?存在spring的容器中
        //因为这些filterchain 都是spring创建的的,所以会保存在spring的 容器中
        //如何从spring的容器中获取到这些对象

//        遍历 获取每一个策略
        Set<Map.Entry<String, FiltersChain>> entries = filterChainMap.entrySet();
        for(Map.Entry<String, FiltersChain> chainEntry:entries){
//            获取每一个策略
            FiltersChain filterChain = chainEntry.getValue();
//              通过策略 处理消息 如果返回false  意味着被拦截了
            boolean result = filterChain.dealSms(standard_submit);

            if(!result){
                //如果拦截了我们需要告诉客户因为什么原因拦截的,我们分析后觉得可以在处理的时候如果有问题直接发送mq出去,当前的boolean的返回值只有一个目的,是否中断后续操作
                return;//一个策略拦截后 后面的策略不需要再执行,只需要返回结果即可
            }

        }
    }
}
